1. Uncrackable 소개
1.1 개요
Uncrackable 시리즈는
OWASP Mobile Application Security Testing Guide (MASTG)
으로, 모바일에서 발생할 수 있는 취약점을 실습 할 수 있는 모바일 애플리케이션 모음입니다.1.2 다운로드
해당 웹사이트에서 다운 받을 수 있으며,
view Raw
버튼을 누르면 다운로드 됩니다.1.3 실습 준비 도구
유형 별로 정리해 두었습니다. 유형 별로 맘에 드는 도구를 선택하여 사용하시면 됩니다.
Apk 분석 툴
- jadx (추천) → 현재 풀이에서 사용
- BytecodeViewer
- jd-gui & dex2jar
리버스 엔지니어링 도구
- IDA
- Gidra
Frida
- Frida (client, server) 환경 구축 완료 상태
device
- mobile device ( 루팅폰 ) → 현재 풀이에서 사용
- ADV ( 루팅 )
- NOX ( 루팅 )
2. Uncrackable1
디바이스에 해당 어플리케이션을 설치한 상태로 진행합니다.
디바이스는 반드시 루팅 된 상태
여야 합니다adb install <apk> 혹은 USB 연결로 옮겨서 설치하기
2.1 루팅 탐지 우회
대부분의 모바일 애플리케이션은, 현재 애플리케이션이 돌아가고 있는 환경이 루팅이 된 디바이스인지 확인합니다. 해당 애플리케이션도
루팅
이 되었는지 체크 후, alert
를 발생 시키는 것을 볼 수 있습니다.루팅 탐지
- 루팅된 디바이스에서 애플리케이션을 실행하면 alert 발생
- OK 버튼을 누르면
exit
을 호출하여 애플리케이션 종료
소스코드 분석
1.
jadx
를 이용하여 Uncrackable1.apk를 분석을 시작합니다.2. 루팅 탐지 로직을 찾기 위하여, alert로
Root Detected
을 띄우는 부분을 검색합니다.- 해당 코드를 부면
c.a, c.b, c.c
메서드를 호출하고, 해당 메서드가 True를 반환하면 alert를 띄우는 것을 볼 수 있습니다.
3. class c를 분석해 보겠습니다.
c.a
에서는 su가 PATH에 등록되어 있는지 확인합니다.
c.b
에서는 빌드 태그를 확인하여, 개발 환경에서 테스트 목적으로 배포되었는지 확인합니다.
c.c
에서는 루팅에 사용되는 주요 경로들을 검사합니다.
➡️ 즉, 해당 함수들을 우회하면, 기본적으로 루팅 탐지를 우회 할 수 있습니다.
루팅 탐지 우회
1. Frida Script를 이용하여, 해당 함수들이 아무 동작을 하지 않고
false
를 리턴하도록 해보겠습니다.setImmediate(function(){ Java.perform(function(){ let rootDetactClass = Java.use("sg.vantagepoint.a.c") // c.a 함수 재구현 rootDetactClass.a.implementation = function(){ return false; } // c.b 함수 재구현 rootDetactClass.b.implementation = function(){ return false; } // c.c 함수 재구현 rootDetactClass.c.implementation = function(){ return false; } }) })
2. Frida Script를
Spawn
형태로 실행시킵니다. ( -f 옵션 ) - -f 옵션을 줄 경우, 애플리케이션이 실행되면서, 스크립트가 동작합니다.
루팅 탐지 우회 성공
- 루팅 탐지가 진행되지 않고, Verify를 하라는 EditTextWidget이 보이게 됩니다.
2.2 Secret Value 분석
1. Verify 분석
2.1 루팅탐지 우회 이후 발견된
Verify 부분을 분석해 보면, EditText에서 입력된 값을 기준으로, a.a
method를 실행시켜 입력 값을 확인하는 로직이 존재합니다. 2. a.a method 분석
a.a
method를 보면, 사용자의 입력값을 a.a.a
method에서 무언가 동작하여 도출된 결과값과 일치한지 비교하게 됩니다.물론 해당 값을
true
로 return 할 수 있지만, 해당 코드에서는 a.a.a
에서 도출되는 bArr
값을 알아내는 것이 중요해 보입니다. ※ a.a.a 함수 분석
- 해당 함수를 보면 AES 암호화 알고리즘을 사용하였고, 복호화 작업을 하여 Return 하는 것을 알 수 있습니다.
- 이 부분에서 return 되는 부분을 찾아내면 될 것 같습니다.
3. Secret value 찾아내기
후킹을 하는 방법도 있겠지만,
a.a.a
의 결과값을 받아오는 Frida Script를 작성해 보겠습니다.setImmediate(function(){ Java.perform(function(){ // aes decrypt module, (aes, cbc) const aesDecryptModule = Java.use("sg.vantagepoint.a.a"); const base64Module = Java.use("android.util.Base64"); const keyGenerate = Java.use("sg.vantagepoint.uncrackable1.a"); const stringModule = Java.use("java.lang.String"); let key = keyGenerate.b("8d127684cbc37c17616d806cf50473cc") let base64EncodedString = "5UJiFctbmgbDoLXmpL12mkno8HT4Lv8dlat8FxR2GOc="; let data = base64Module.decode(base64EncodedString, 0); let decodedData = aesDecryptModule.a(key, data); console.log(stringModule.$new(decodedData)); }) })
a.a.a
method를 호출할 때와 동일하게 인자를 전달하고, 결과 값을 출력합니다.
3. Solv
- 해당 스크립트를 마지막으로 Secret Value를 추출할 수 있었습니다.
3.1 Point
- Rooting 탐지 쪽 함수
- 후킹
- 중요 정보 탈취 가능성, secret value 하드코딩